/* Ansteuerprogramm für drei Punktmatrixelemente
   Hier werden die 15 Spalten sequentiell aktiviert (gegen Erde durchgeschaltet),
   während die sieben Zeilen jeweils pro Spalte mit einem Byte beschickt werden.
   Die Wiederholfrequenz ist dann so schnell, dass das Auge die sequentielle 
   Aktivierung der LEDs nicht wahr nimmt.
 */
 
// Definert Pis für Zeilenansteuerung:
int Zeile[] =  {29, 43, 41, 39, 37, 35, 33, 31};
//   Stecher  | -   Z1  Z2  Z3  Z4  Z5  Z6  Z7  Z8 |
//   Stecker  | S0  S1  S2  S3  -   -   -   -   -  |
int Spalte[] = {44, 42, 40, 38};
// 4-Bitbus: Definiert Pins für sequentielle Spaltenansteuerung

int Eins = 0; // Spaltenbusinitialisierung
int Zwei = 0;
int Vier = 0;
int Acht = 0;

int Wiederholung = 0; // Wiederholungen des Anzeigeinhalts vor Zeilenverschiebung. 
int Versatz = 0; // Versatz des Textes beim Rollen
int Sversatz =0; // Spalte mit Versatz
int Textspalten = 0; // Anzahl der Zeichen
long t0 = 0;

int Text[] = { 124, 18, 17, 18, 124, 0, 124, 8, 4, 120,  0, 124, 8, 4, 120, 0, 0, 58, 64, 0, 0, 0, 0, 0, 0, 124, 18, 17, 18, 124, 0, 124, 8, 4, 120, 0, 124, 8, 4, 120, 0, 0, 58, 64, 0, 0, 0, 0, 0, 0}; // Text Anni
// int Text[] = { 4, 2, 126, 2, 2, 0, 58, 64, 0, 120, 4, 120, 4, 120, 0, 0, 0, 0, 0, 0}; // Text Tim
//int Text[] = { 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Text |
// int Text[] = { 32, 64, 64, 63, 0, 62, 64, 64, 62, 0, 76, 74, 74, 50, 0, 0, 2, 63, 66, 0, 0, 0, 58, 64, 0, 0, 120, 4, 4, 120, 0, 0, 0, 0, 0, 32, 64, 64, 63, 0, 62, 64, 64, 62, 0, 76, 74, 74, 50, 0, 0, 2, 63, 66, 0, 0, 0, 58, 64, 0, 0, 120, 4, 4, 120, 0, 0, 0, 0, 0}; // Text Justin

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(Zeile[1], OUTPUT);
  pinMode(Zeile[2], OUTPUT);
  pinMode(Zeile[3], OUTPUT);
  pinMode(Zeile[4], OUTPUT);
  pinMode(Zeile[5], OUTPUT);
  pinMode(Zeile[6], OUTPUT);
  pinMode(Zeile[7], OUTPUT);

  pinMode(Spalte[3],  OUTPUT);
  pinMode(Spalte[2],  OUTPUT);
  pinMode(Spalte[1],  OUTPUT);
  pinMode(Spalte[0],  OUTPUT);
  
  Textspalten = sizeof(Text)/2; // Der Text ist zwecks Rollens doppel hintereinander

} // Ende Steup

// the loop routine runs over and over again forever:
void loop()
  {
  do  // Schleife Wiederholungen
    {
    for (int j=0; j<15;++j) // aktiviert sequentiell Spalten
      { 
      Sversatz = (j+Versatz)%Textspalten; // Versatz ist die aktuelle Verschiebung des Textes (am Ende incrementiert) bis "Textspalten"
      // Setzt in den Zeilen Anzeigebytes
      if (Text[Sversatz] &  1) digitalWrite(Zeile[1], HIGH); else digitalWrite(Zeile[1], LOW);
      if (Text[Sversatz] &  2) digitalWrite(Zeile[2], HIGH); else digitalWrite(Zeile[2], LOW);
      if (Text[Sversatz] &  4) digitalWrite(Zeile[3], HIGH); else digitalWrite(Zeile[3], LOW);
      if (Text[Sversatz] &  8) digitalWrite(Zeile[4], HIGH); else digitalWrite(Zeile[4], LOW);
      if (Text[Sversatz] & 16) digitalWrite(Zeile[5], HIGH); else digitalWrite(Zeile[5], LOW);
      if (Text[Sversatz] & 32) digitalWrite(Zeile[6], HIGH); else digitalWrite(Zeile[6], LOW);
      if (Text[Sversatz] & 64) digitalWrite(Zeile[7], HIGH); else digitalWrite(Zeile[7], LOW);
      
      // Dekodierung der integer Laufvariable in 4-Bitansteuerbus:
      Eins = j & 1;  // immer noch integer
      Zwei = (j & 2);
      Vier = (j & 4);
      Acht = (j & 8);
  
      if (Acht == 8) digitalWrite(Spalte[3], HIGH); else digitalWrite(Spalte[3], LOW); 
      if (Vier == 4) digitalWrite(Spalte[2], HIGH); else digitalWrite(Spalte[2], LOW);
      if (Zwei == 2) digitalWrite(Spalte[1], HIGH); else digitalWrite(Spalte[1], LOW);
      if (Eins == 1) digitalWrite(Spalte[0], HIGH); else digitalWrite(Spalte[0], LOW);
      t0 = micros();
      do {} while ((micros()-t0)<1000);
      ++Wiederholung;
      } // Ende for Schleife für Spaltenansteuerung
    } // Ende while
    while (Wiederholung <256); // Grenze Wiederholung
    Wiederholung = 0;
    if (Versatz < Textspalten) ++Versatz; else Versatz = 0;  
    
  } // Ende Loop

